package blockqueue;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 消费者
 */
public class Consumer implements Runnable {
	
	private BlockingQueue<String> queue; // 阻塞队列
	
	public Consumer(BlockingQueue<String> queue) {
		super();
		this.queue = queue;
	}

	@Override
	public void run() {
		System.err.println("启动消费者线程！");
		Random r = new Random();
		boolean isRunning = true;
		
		try {
			while(isRunning) {
				System.err.println("正从队列获取数据...");
				String data = queue.poll(2, TimeUnit.SECONDS);//有数据时直接从队列的队首取走，无数据时阻塞，在2s内有数据，取走，超过2s还没数据，返回失败
				if(data!=null) {
					System.err.println("拿到数据：" + data);
					System.err.println("正在消费数据：" + data);
					Thread.sleep(r.nextInt(1000));
				} else { // 超过2s还没数据，认为所有生产线程都已经退出，自动退出消费线程。
					isRunning = false;
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
			Thread.currentThread().interrupt();
		} finally {
			System.err.println("退出消费者线程！");
		}
	}

}
